package main

import (
	"gorm.io/gorm"
	"time"
)

type Tag struct {
	ID   uint   `gorm:"type:uint"`
	Name string `gorm:"type:varchar(20)"`
	//Article []Brticle `gorm:"many2many:brticle_tag"` //用于反向引用
}
type Brticle struct {
	ID    uint   `gorm:"type:uint"`
	Title string `gorm:"type:varchar(30)"`
	Tag   []Tag  `gorm:"many2many:brticle_tags"`
}

// Brticle2Tags 自定义第三张表 可以显示更多的信息
type BrticleTag struct {
	BrticleID uint      `gorm:"primaryKey"`
	TagID     uint      `gorm:"primaryKey"`
	CreatedAt time.Time `json:"created_at"`
}

// BeforeCreate 钩子函数  解决自定义连接表添加文章并关联标签时自动添加时间
func (b *BrticleTag) BeforeCreate(db *gorm.DB) error {
	b.CreatedAt = time.Now()
	return nil
}
func main() {
	DB.SetupJoinTable(&Brticle{}, "Tag", &BrticleTag{}) //自定义连接表 通过Brticle表查设置tag
	DB.AutoMigrate(&Tag{}, &Brticle{}, &BrticleTag{})
	DB = DB.Session(&gorm.Session{
		Logger: mysqlLogger,
	})
	//自定义连接表的增删改查
	//1. 自定义表的查询
	//var brticle Brticle
	//DB.Preload("Tag").Take(&brticle, 2)
	//fmt.Println(brticle)
	//2 添加文章并关联已有的标签
	//var tag []Tag
	//DB.Find(&tag, []int{1, 2})
	//DB.Create(&Brticle{
	//	Title: "flask基础",
	//	Tag:   tag,
	//})
	//3 给已有文章替换标签
	// 先查找第二篇文章的tag  然后查找tag列表中的第二个tag  将第二篇文章原有的tag使用replace替换为新查出的tag
	var brticle Brticle
	DB.Preload("Tag").Take(&brticle, 2)
	var tag Tag
	DB.Find(&tag, []int{2})
	DB.Model(&brticle).Association("Tag").Replace(&tag)
}
